package stream01;

import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * Stream流的终止操作
 *  1.迭代
 *      void forEach(Consumer<? super T> action):逐个消费(迭代)集合中的元素
 *  2.统计
 *     long count():统计流中的元素的个数
 *     Optional<T> max(Comparator<? super T> comparator):按照指定的比较规则(Compartor接口实现的规则,原理类似TreeSet/TreeMap),获取流中最大元素
 *     Optional<T> min(Comparator<? super T> comparator):按照指定的比较规则(Compartor接口实现的规则,原理类似TreeSet/TreeMap),获取流中最小元素
 *  3.查找
 *      Optional<T> findFirst():获取流中的第一个元素
 *  4.匹配
 *    allMatch():只有流中的元素都满足条件(传入的Predicate对应的Lambda表达式),allMatch才返回true,只要有一个不满足就返回false
 *    anyMatch():只要有任意一个元素满足条件(传入的Predicate对应的Lambda表达式),anyMatch就返回true,都不满足才返回false
 *    noneMatch():只有流中所有元素都不满足条件(传入的Predicate对应的Lambda表达式),noneMatch才返回true,否则返回false
 *  5.收集
 *      collect(Collector<? super T, A, R> collector):我们可以将最终操作结果收集到一个集合(List,Set,Map)中
 *            主要通过Collectors.toList() Collectors.toSet() Collectors.toMap收集到不同集合中
 */
public class StreamDemo03 {
    List<String> list = Arrays.asList("zhangsan","lisi","laowang");
    @Test
    public void test01(){
       /* for (String s : list) {
            System.out.println(s);
        }*/

        //list.stream().forEach(str -> System.out.println(str));
        list.stream().forEach(System.out::println);
    }

    @Test
    public void test02(){
        System.out.println(list.stream().count());
    }

    @Test
    public void test03(){
        //获取集合中长度最长的字符串
        //zhangsan(8) lisi(4) laowang(7)
        //lisi(4) laowang(7) zhangsan(8)
        Optional<String> maxOptional = list.stream().max((str1, str2) -> str1.length() - str2.length());
        System.out.println(maxOptional.get());

        //list.stream().max(Comparator.comparing(str -> str.length()));
        System.out.println(list.stream().max(Comparator.comparing(String::length)).get());
        System.out.println(list.stream().max(Comparator.comparingInt(String::length)).get());
    }

    @Test
    public void test04(){
        System.out.println(list.stream().min(Comparator.comparing(String::length)).get());
    }

    @Test
    public void test05(){
        System.out.println(list.stream().findFirst().get());
    }

    @Test
    public void test06(){
        System.out.println(list.stream().allMatch(str -> str.length() > 4));//false
        System.out.println(list.stream().anyMatch(str -> str.length() > 4));//true
        System.out.println(list.stream().noneMatch(str -> str.length() > 4));//false
    }

    @Test
    public void test07(){
        Set<String> set = list.stream().collect(Collectors.toSet());//将流中的元素收集一个Set集合中
        System.out.println(set);
    }

    @Test
    public void test08(){
        Map<String, Integer> map = list.stream().collect(Collectors.toMap(str -> str, str -> str.length()));
        System.out.println(map);
    }
}
